const express = require('express');
const cors = require('cors');
const dotenv = require('dotenv');
const path = require('path');
const morgan = require('morgan');
const helmet = require('helmet');
const multer = require('multer');

// 加载环境变量
dotenv.config();

// 从环境变量获取最大文件大小限制，默认为3GB
const maxFileSize = parseInt(process.env.MAX_FILE_SIZE || 3000, 10) * 1024 * 1024;
console.log(`Express请求体大小限制设置为: ${maxFileSize / (1024 * 1024)}MB`);

// 路由
const cosRoutes = require('./routes/cos.routes');
const metadataRoutes = require('./routes/metadata.routes');

// 数据库
const db = require('./models');

const app = express();
const PORT = process.env.PORT || 3000;

// 安全配置
app.use(helmet({ contentSecurityPolicy: false }));

// CORS 配置
app.use(cors());

// 日志
app.use(morgan('dev'));

// 解析JSON请求体 - 使用配置的文件大小限制
app.use(express.json({ limit: `${maxFileSize}b` }));
app.use(express.urlencoded({ extended: true, limit: `${maxFileSize}b` }));

// 设置路由
app.use('/api/cos', cosRoutes);
app.use('/api/metadata', metadataRoutes);

// 处理文件大小超限的错误 - 移至路由设置之后
app.use((err, req, res, next) => {
  if (err instanceof multer.MulterError && err.code === 'LIMIT_FILE_SIZE') {
    return res.status(413).json({
      success: false,
      message: `文件大小超过限制，最大允许 ${maxFileSize / (1024 * 1024)}MB`
    });
  }
  next(err);
});

// 静态文件
app.use(express.static(path.join(__dirname, '../frontend/dist')));

// 客户端路由
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, '../frontend/dist/index.html'));
});

// 通用错误处理
app.use((err, req, res, next) => {
  console.error(err.stack);
  const statusCode = err.statusCode || 500;
  const message = err.message || '服务器内部错误';
  
  res.status(statusCode).json({
    success: false,
    message,
    error: process.env.NODE_ENV === 'production' ? null : err.stack
  });
});

// 初始化数据库并启动服务器
db.sequelize.sync()
  .then(() => {
    console.log('数据库连接成功并同步完成');
    app.listen(PORT, () => {
      console.log(`服务器运行在 http://localhost:${PORT}`);
    });
  })
  .catch(err => {
    console.error('数据库初始化失败:', err);
  });

module.exports = app; 